package com.bosssoft.trainee.service.imp;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bosssoft.trainee.dao.ResourceDao;
import com.bosssoft.trainee.mbg.dto.ResourceDTO;
import com.bosssoft.trainee.mbg.mapper.ResourceMapper;
import com.bosssoft.trainee.mbg.po.Resource;
import com.bosssoft.trainee.service.ResourceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Author: wuxin
 * @Date: 2022/6/17
 * @Project rbac
 * @Version 1.0
 * @Description
 */
@Service
public class ResourceServiceImp implements ResourceService {
    @Autowired
    ResourceMapper resourceMapper;
    @Autowired
    ResourceDao resourceDao;

    /**
     * 获取资源列表
     *
     * @param pageSize 页大小
     * @param pageNum  页数
     * @param example  样例
     * @return 一页数据
     */
    @Override
    public Page<Resource> getList(int pageSize, int pageNum, ResourceDTO example) {
        Resource resource = new Resource();
        BeanUtil.copyProperties(example, resource);
        QueryWrapper<Resource> resourceqw = new QueryWrapper<>(resource);
        return resourceMapper.selectPage(new Page<>(pageNum, pageSize), resourceqw);
    }

    /**
     * 根据id删除资源
     *
     * @param id 删除对象id
     * @return 受影响的记录数
     */
    @Override
    public int deleteById(int id) {
        return resourceMapper.deleteById(id);
    }

    /**
     * 新增资源
     *
     * @param resourceDTO 新增对象
     * @return 受影响的记录数
     */
    @Override
    public int addResource(ResourceDTO resourceDTO) {
        if (!checkApi(resourceDTO.getApi()) && !checkCode(resourceDTO.getCode()) && !checkUrl(resourceDTO.getUrl()) && exist(resourceDTO.getParentId())) {
            Resource resource = new Resource();
            BeanUtil.copyProperties(resourceDTO, resource);
            resource.setId(null);
            return resourceMapper.insert(resource);
        } else {
            return 0;
        }
    }

    /**
     * 更新资源
     *
     * @param resourceDTO 更新对象
     * @return 受影响的记录数
     */
    @Override
    public int updateResource(ResourceDTO resourceDTO) {
        //TODO-可以补一个后端的api、url、code的不重复校验
        Resource resource = new Resource();
        BeanUtil.copyProperties(resourceDTO, resource);
        if(resource.getParentId()==null || exist(resource.getParentId())){
            return resourceMapper.updateById(resource);
        }else {
            return 0;
        }

    }

    /**
     * 检查代码是否被使用
     *
     * @param code 需要检查的代码
     * @return true:被使用，false：未被使用
     */
    @Override
    public boolean checkCode(String code) {
        return resourceDao.checkCode(code) > 0;
    }

    /**
     * 检查Api是否被使用
     *
     * @param api 需要检查的Api
     * @return true:被使用，false：未被使用
     */
    @Override
    public boolean checkApi(String api) {
        return resourceDao.checkApi(api) > 0;
    }

    /**
     * 检查url是否被使用
     *
     * @param url 需要检查的url
     * @return true:被使用，false：未被使用
     */
    @Override
    public boolean checkUrl(String url) {
        return resourceDao.checkUrl(url) > 0;
    }

    /**
     * 检查对应id的资源是否存在
     *
     * @param id 需要检查的id
     * @return true:存在，false：不存在
     */
    @Override
    public boolean exist(Integer id) {
        return id==null||resourceDao.exist(id) > 0;
    }
}
